import { app, BrowserWindow, ipcMain, screen, dialog, Menu } from 'electron'
import updateHandle from './updater'
// import store from '../renderer/store' // 主进程和渲染进程直接共享store，请使用这里

/**
 * Set `__static` path to static files in production
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
 */
if (process.env.NODE_ENV !== 'development') {
  global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
}

let mainWindow
const winURL = process.env.NODE_ENV === 'development'
  ? `http://localhost:9080`
  : `file://${__dirname}/index.html`

function createWindow() {
  /**
   * Initial window options
   */
  const options = {
    width: 730, // 窗口宽度
    height: 408, // 窗口高度
    backgroundColor: '#F5F5F5',
    show: false, // 创建后是否显示
    center: true, // 是否出现在屏幕居中的位置
    useContentSize: true, // width 和 height 使用web网页size, 这意味着实际窗口的size应该包括窗口框架的size，稍微会大一点
    frame: false, // 要创建无边框窗口，frame 设置为 false
    webPreferences: {
      webSecurity: false // 当设置为 false, 它将禁用同源策略
    },
    resizable: false // 窗口是否可以改变尺寸.
  }

  if (process.platform === 'win32') { // 针对windows平台做出不同的配置
    options.show = true // 创建即展示
    options.frame = false // 创建一个frameless窗口
    options.backgroundColor = '#F5F5F5' // 背景色
  }

  // 实例化主进程
  mainWindow = new BrowserWindow(options)


  mainWindow.loadURL(winURL)

  // 更新;
  updateHandle(mainWindow)

  // 监听主进程上的事件
  mainWindow.once('ready-to-show', () => {
    mainWindow.show()
    // mainWindow.setOpacity(1.0)
  })

  mainWindow.on('closed', () => {
    mainWindow = null
  })
  // mainWindow.on('enter-full-screen', () => sendWindowStateEvent('enter-full'))
  // mainWindow.on('leave-full-screen', () => sendWindowStateEvent('leave-full'))
  mainWindow.on('maximize', () => sendWindowStateEvent('maximized')) // 最大化
  // mainWindow.on('minimize', () => sendWindowStateEvent('minimized')) // 最小化
  mainWindow.on('unmaximize', () => sendWindowStateEvent('unmaximize')) // 退出最大化
  // mainWindow.on('restore', () => sendWindowStateEvent('restore')) // 恢复
  // mainWindow.on('hide', () => sendWindowStateEvent('hidden')) // 隐藏
  // mainWindow.on('show', () => sendWindowStateEvent('show')) // 显示
  mainWindow.on('resize', () => sendWindowStateEvent('resize')) // 调整窗口大小后触发
  // 主程序崩溃后触发
  mainWindow.webContents.on('crashed', () => {
    const options = {
      type: 'error',
      title: '进程崩溃了',
      message: '这个进程已经崩溃..，',
      buttons: ['重载', '退出'],
    };
    recordCrash().then(() => {
      dialog.showMessageBox(options, (index) => {
        if (index === 0) reloadWindow(mainWindow);
        else app.quit();
      });
    }).catch((e) => {
      console.log('err', e);
    });
  })
}


// 窗口状态通知函数
function sendWindowStateEvent(state) {
  // 非全屏状态下调整窗口大小
  if (state === 'resize') {
    const { width, height } = screen.getPrimaryDisplay().workAreaSize // 获取当前显示设备的宽度和高度
    let bounds = mainWindow.getNormalBounds();
    if (bounds.width != width || bounds.height != height) {
      mainWindow.webContents.send('window-state-changed', state, bounds)
    }
  }
  mainWindow.webContents.send('window-state-changed', state)
}

// 只允许启动一个实例 see: https://electronjs.org/docs/api/app#apprequestsingleinstancelock
const gotTheLock = app.requestSingleInstanceLock()

if (!gotTheLock) {
  app.quit()
} else {
  app.on('second-instance', (event, commandLine, workingDirectory) => {
    // 当运行第二个实例时,将会聚焦到myWindow这个窗口
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore()
      mainWindow.focus()
    }
  })

  // 禁用缓存
  app.commandLine.appendSwitch("--disable-http-cache");

  app.on('ready', createWindow)

  app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
      app.quit()
    }
  })

  app.on('activate', () => {
    if (mainWindow === null) {
      createWindow()
    }
  })
}

// 程序崩溃使用
function recordCrash() {
  return new Promise(resolve => {
    // 崩溃日志请求成功.... 
    resolve();
  })
}

// 重载应用
function reloadWindow(mainWin) {
  if (mainWin.isDestroyed()) {
    app.relaunch();
    app.exit(0);
  } else {
    BrowserWindow.getAllWindows().forEach((w) => {
      if (w.id !== mainWin.id) w.destroy();
    });
    mainWin.reload();
  }
}

// 减少过多广播的方法
ipcMain.on('win-msg', function (event, type, ...args) {
  // console.log(type)
  // console.log(...arg)
  switch (type) {
    case 'close':
      // 退出
      app.quit();
      break;
    case 'minify':
      // 最小化
      mainWindow.minimize();
      break;
    case 'zoom':
      // 最大化
      mainWindow.maximize();
      break;
    case 'reduction':
      // 向下还原(取消窗口最大化)
      mainWindow.unmaximize();
      break;
    case 'reset':
      // 用户登录后重设部分配置(最小宽高，允许用户可以手动调整窗口大小)
      try {
        // const { width, height } = screen.getPrimaryDisplay().workAreaSize // 获取当前显示设备的宽度和高度
        let setWidth = 1220; // width * 0.6
        let setHeight = 772; // height * 0.7
        mainWindow.setResizable(true) // 重设，允许用户可以手动调整窗口大小
        mainWindow.setMinimumSize(setWidth, setHeight) // 设置窗口最小化的最小 width 和height
        mainWindow.center()  // 设置窗口位置居中
      } catch (error) {
        console.log(error)
      }
      break;
    case 'goLogin':
      console.log('goLogin in')
      try {
        let setWidth = 730;
        let setHeight = 408;
        mainWindow.setMinimumSize(setWidth, setHeight) // 设置窗口最小化的最小 width 和height
        mainWindow.setSize(setWidth, setHeight)
        mainWindow.center()  // 设置窗口位置居中
      } catch (error) {
        console.log(error)
      }
      break;
    case 'reset-wh':
      // 重设最小宽高，重设当前宽高并居中
      try {
        // const { width, height } = screen.getPrimaryDisplay().workAreaSize // 获取当前显示设备的宽度和高度
        let setWidth = 1220; // width * 0.6
        let setHeight = 772; // height * 0.7
        mainWindow.setResizable(true) // 重设，允许用户可以手动调整窗口大小
        mainWindow.setMinimumSize(setWidth, setHeight) // 设置窗口最小化的最小 width 和height
        mainWindow.setSize(setWidth, setHeight); // 将窗口的大小调整为width和height. 如果width或height低于设定的最小值, 那么对应的大小将被截断至设定的最小值.
        mainWindow.center()  // 设置窗口默认位置和宽高
      } catch (error) {
        console.log(error)
      }
      break;
    case 'set-mini':
      try {
        // 调整成迷你悬浮窗大小
        mainWindow.setResizable(false) // 重设，不允许用户手动调整窗口大小
        mainWindow.setMinimumSize(500, 170) // 设置窗口最小化的最小 width 和height
        mainWindow.setSize(500, 170); // 将窗口的大小调整为width和height
        // mainWindow.setBackgroundColor()
        mainWindow.center()  // 设置窗口默认位置和宽高
      } catch (error) {
        console.log(error)
      }
      break;
    case 'mini-back':
      try {
        let { width, height } = args[0]
        let setWidth = 1220; // width * 0.6
        let setHeight = 772; // height * 0.7
        mainWindow.setResizable(true) // 重设，允许用户可以手动调整窗口大小
        mainWindow.setMinimumSize(setWidth, setHeight) // 设置窗口最小化的最小 width 和height
        // 判断用户是以哪种尺寸的窗口进来的，然后进行目标窗口大小设置，默认中等/经用户拉伸/全屏
        // mainWindow.setBounds({ x: 440, y: 225, width: 800, height: 600 })
        // mainWindow.setBounds(args[0])
        mainWindow.setSize(width, height); // 将窗口的大小调整为width和height
        mainWindow.center()  // 设置窗口默认位置和宽高
      } catch (error) {
        console.log(error)
      }
      break;
    case 'show-report':
      try {
        // 显示报表，重设迷你窗口的高度
        mainWindow.setResizable(false) // 重设，不允许用户手动调整窗口大小
        mainWindow.setMinimumSize(500, 374) // 设置窗口最小化的最小 width 和height
        mainWindow.setSize(500, 374); // 将窗口的大小调整为width和height. 
      } catch (error) {
        console.log(error)
      }
      break;
    case 'hide-report':
      try {
        // 显示报表，重设迷你窗口的高度
        mainWindow.setResizable(false) // 重设，不允许用户手动调整窗口大小
        mainWindow.setMinimumSize(500, 170) // 设置窗口最小化的最小 width 和height
        mainWindow.setSize(500, 170); // 将窗口的大小调整为width和height. 
      } catch (error) {
        console.log(error)
      }
      break;
  }
});

// 创建子窗口
let sonWindow = null;
function createSonWindow(parms) {
  if (sonWindow) {
    sonWindow.close();
    sonWindow = null
  }
  sonWindow = new BrowserWindow({
    width: parms.width,
    height: parms.height,
    frame: parms.frame, // 去掉边框
    // maximizable: false, // 去掉最大化按钮
    webPreferences: {
      // highDpiSupport: true,
      nodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false
      // 是否在独立 JavaScript 环境中运行 Electron API和指定的preload 脚本.默认为 true
      contextIsolation: false,  // Electron 12 版本之后它将被默认true 
      enableRemoteModule: true,
    }
  })
  sonWindow.on('close', (event) => {
    sonWindow = null
  });
  sonWindow.setMenu(null)
  // require('electron').dialog.showMessageBoxSync(mainWindow, {
  //   type: 'question',
  //   title: '提示',
  //   message: JSON.stringify(parms.router ? winURL + '#' + parms.url : parms.url)
  // });
  console.log('打开地址====>', parms.router ? winURL + '#' + parms.url : parms.url)
  sonWindow.loadURL(parms.router ? winURL + '#' + parms.url : parms.url)
}
ipcMain.on('openSonWindow', (event, args = {
  width: 800, // 宽度
  height: 500, // 高度
  url: 'http://www.baidu.com', // 地址
  frame: true, // 是否显示边框
  router: false, // 是否使用项目中路由进行窗口地址加载
}) => {
  if (args.frame == null || args.frame == undefined) args.frame = true
  console.log('args====>', args)
  createSonWindow(args)
})
/**
 * Auto Updater
 *
 * Uncomment the following code below and install `electron-updater` to
 * support auto updating. Code Signing with a valid certificate is required.
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating
 */

/*
import { autoUpdater } from 'electron-updater'

autoUpdater.on('update-downloaded', () => {
  autoUpdater.quitAndInstall()
})

app.on('ready', () => {
  if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates()
})
 */
